package com.example.dakotanews.utils;

import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class TimeHandler {

    /**
     * @param dateTime 接受一个LocalDateTime类型的时间戳参数
     * @return 返回一个 表示参数时间在距现在多久之前 的字符串
     * @description 将 时间戳 转换为“多久之前“的时间表示
     */
    public String dateTimeConvert(LocalDateTime dateTime) {

        // 要返回的转换后的表示时间的字符串
        String timeString;
        // 获取系统当前时间
        LocalDateTime currentTime = LocalDateTime.now();
        // 获取目标时间和当前时间的时间间隔
        Duration duration = Duration.between(dateTime, currentTime);

        // 获取时间间隔对应的天数、小时数、分钟数和秒数
        long durationDays = duration.toDays();               // 天数
        long durationHours = duration.toHours() % 24;        // 小时数
        long durationMinutes = duration.toMinutes() % 60;    // 分钟数

        if (durationDays == 0 && durationHours == 0 && durationMinutes < 1) {
            // 若时间间隔小于1分钟
            timeString = "刚刚";
        } else if (durationDays == 0 && durationHours < 1) {
            // 若时间间隔小于1小时
            timeString = durationMinutes + "分钟前";
        } else if (durationDays <= 1) {
            if (dateTime.getDayOfYear() == currentTime.getDayOfYear()) {
                // 若时间间隔小于1天且目标时间在当天
                timeString = durationHours + "小时前";
            } else {
                // 若目标时间在前一天
                timeString = "昨天 " + dateTime.getHour() + ":" + dateTime.getMinute();
            }
        } else if (durationDays <= 3) {
            // 若时间间隔大于1天小于3天
            timeString = durationDays + "天前";
        } else if (durationDays <= 365) {
            if (dateTime.getYear() == currentTime.getYear()) {
                // 若目标时间在当年
                timeString = dateTime.getMonthValue() + "月" + dateTime.getDayOfMonth() + "日";
            } else {
                // 若目标时间在前一年
                timeString = dateTime.getYear() + "年" + dateTime.getMonthValue() + "月" + dateTime.getDayOfMonth() + "日";
            }
        } else {
            // 若时间间隔大于365天
            timeString = dateTime.getYear() + "年" + dateTime.getMonthValue() + "月" + dateTime.getDayOfMonth() + "日";
        }
        /*
        关于将一年定为365天的解释说明：
        没什么争议的是，有关将一年定为365还是366天的分歧，主要来源于闰年的存在。
        首先看看将一年定为366天可能出现的问题。
        以2022、2023年为例（均非闰年），如果目标时间戳是2022年12月31日23:59，系统当前时间为2023年12月31日00:01，（时间间隔为365天2分）
        那么通过该方法转换的时间将会显示为：12月31日。那么按照常识理解就会认为这是2023年的12月31日，也就是当天，然而事实并非如此。
        会产生较大的歧义。因此这个方法不可取。

        那么将一年定为365天就可以高枕无忧了吗？还是会有一点逻辑失误。
        以2024年为例（闰年），如果目标时间戳是2024年1月1日00:01，系统当前时间为2024年12月31日23:59，（时间间隔为365天23时58分）
        那么此时转换的时间将会显示为：2024年1月1日。但是根据方法的理念，与系统当前时间在同一年的时间戳，不应该显示年份的。
        不过这个问题就没那么严重了，因此要将一年定为365天。
         */

        return timeString;
    }

    /**
     * @param dateTime LocalDateTime类型的时间戳
     * @return yyyy-MM-dd HH:mm格式字符串
     * @description 时间格式化（精确到分）
     */
    public String dateTimeFormat(LocalDateTime dateTime) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

        return dateTime.format(formatter);
    }

    /**
     * @param dateTime LocalDateTime类型的时间戳
     * @return yyyy-MM-dd格式字符串
     * @description 日期格式化（精确到天）
     */
    public String dateTimeFormatToDay(LocalDateTime dateTime) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        return dateTime.format(formatter);
    }


}
